////////////////////////////////////////////////////////////////////////
//
//                       AvaMods Modified AdminCMD
//
//
//   changes: diamond-optic
//   original: AMXX Dev Team
//   version: 1.0
//   last update: 06.11.07 (05.27.07)
//
//
// Infomation:
//
//	- Base: AMXX 1.76d
//	- Up to date with AMXX SVN as of 04.22.07
//
//	- Admins can hide their flags & fake their steam id (starts with STEAM_0)
//	- bots will be given a random steam id (starts with STEAM_1)
//	- disconnect info in console (name, IP, steam id)
//	- #define ADMIN_HIDE sets what flag you need to hide your stuff
//	- Bans/Kicks are logged to seperate files as well as normal amxx log
//	- 'q' flag is reserved for other AvaMods plugins, gets replaced by 'queer'
//	- IMMUNE admins will get msgs when other admins try cmds on them
//	- Various other additions & changes
//
// Not Working:
//
//	- custom 'status' replacement (to include fake steam ids & country)
//
////////////////////////////////////////////////////////////////////////

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <geoip>
#include <time>

//////////////////////////////////////////////
// Sets Admin Hide level
//
#define ADMIN_HIDE ADMIN_IMMUNITY

new g_pauseCon
new Float:g_pausAble
new bool:g_Paused
new bool:g_PauseAllowed = false
new g_addCvar[] = "amx_cvar add %s"

new discon_auth[33][33], discon_ip[33][44]

new fake_steam[33][18], fake_country[33][4], fake_ip[33][44]

new amx_show_activity, pausable, rcon_password

public plugin_init()
{
	register_plugin("AvaMods Admin Commands", "1.0", "diamond-optic")
	register_cvar("avamods_admincmd_stats", "1.0", FCVAR_SERVER|FCVAR_SPONLY)
	
	register_dictionary("admincmd.txt")
	register_dictionary("common.txt")
	register_dictionary("adminhelp.txt")
	
	register_concmd("amx_kick", "cmdKick", ADMIN_KICK, "<name or #userid> [reason]")
	register_concmd("amx_ban", "cmdBan", ADMIN_BAN, "<name or #userid> <minutes> [reason]")
	register_concmd("amx_banip", "cmdBanIP", ADMIN_BAN, "<name or #userid> <minutes> [reason]")
	register_concmd("amx_addban", "cmdAddBan", ADMIN_BAN, "<authid or ip> <minutes> [reason]")
	register_concmd("amx_unban", "cmdUnban", ADMIN_BAN, "<authid or ip>")
	register_concmd("amx_slay", "cmdSlay", ADMIN_SLAY, "<name or #userid>")
	register_concmd("amx_slap", "cmdSlap", ADMIN_SLAY, "<name or #userid> [power]")
	register_concmd("amx_leave", "cmdLeave", ADMIN_IMMUNITY, "<tag> [tag] [tag] [tag]")
	register_concmd("amx_pause", "cmdPause", ADMIN_IMMUNITY, "- pause or unpause the game")
	register_concmd("amx_who", "cmdWho", ADMIN_ADMIN, "- displays who is on server")
	register_concmd("amx_cvar", "cmdCvar", ADMIN_CVAR, "<cvar> [value]")
	register_concmd("amx_plugins", "cmdPlugins", ADMIN_IMMUNITY)
	register_concmd("amx_modules", "cmdModules", ADMIN_IMMUNITY)
	register_concmd("amx_map", "cmdMap", ADMIN_MAP, "<mapname>")
	register_concmd("amx_cfg", "cmdCfg", ADMIN_CFG, "<filename>")
	register_concmd("amx_nick", "cmdNick", ADMIN_BAN, "<name or #userid> <new nick>")
	
	register_clcmd("amx_rcon", "cmdRcon", ADMIN_RCON, "<command line>")
	register_clcmd("amx_showrcon", "cmdShowRcon", ADMIN_RCON, "<command line>")
	register_clcmd("pauseAck", "cmdLBack")
	
	register_concmd("status","status",0,"- displays server/client status info")
	
	rcon_password = get_cvar_pointer("rcon_password");
	pausable = get_cvar_pointer("pausable");
	
	amx_show_activity = get_cvar_pointer("amx_show_activity");
	
	if (amx_show_activity == 0) // cvar does not exist, register it
		amx_show_activity = register_cvar("amx_show_activity", "0");

}

public plugin_cfg()
{
	// Cvars which can be changed only with rcon access
	server_cmd(g_addCvar, "rcon_password")
	server_cmd(g_addCvar, "amx_show_activity")
	server_cmd(g_addCvar, "amx_mode")
	server_cmd(g_addCvar, "amx_password_field")
	server_cmd(g_addCvar, "amx_default_access")
	server_cmd(g_addCvar, "amx_reserved_slots")
	server_cmd(g_addCvar, "amx_reservation")
	server_cmd(g_addCvar, "amx_conmotd_file")
	server_cmd(g_addCvar, "amx_sql_table");
	server_cmd(g_addCvar, "amx_sql_host");
	server_cmd(g_addCvar, "amx_sql_user");
	server_cmd(g_addCvar, "amx_sql_pass");
	server_cmd(g_addCvar, "amx_sql_db");
	server_cmd(g_addCvar, "amx_sql_type");
}

public client_putinserver(id)
{
	if(is_user_connected(id))
		{
		get_user_authid(id,discon_auth[id],32)
		get_user_ip(id,discon_ip[id],43)
				
		if(get_user_flags(id) & (ADMIN_HIDE))
			{
			formatex(fake_steam[id],18,"STEAM_0:%d:%d", random_num(0,1), random_num(1007320,8740918))
			
			formatex(fake_ip[id],43,"%d.%d.%d.%d",random_num(24,160),random_num(10,240),random_num(50,200),random_num(20,150))
			
			switch(random_num(0,1))
				{
				case 0: formatex(fake_country[id],3,"USA")
				case 1: formatex(fake_country[id],3,"CAN")
				}
			}
		else if(is_user_bot(id))
			{
			formatex(fake_steam[id],18,"STEAM_1:%d:%d", random_num(0,1), random_num(1007320,8740918))
			formatex(fake_country[id],3,"USA")
			}
		}
}

public client_disconnect(id)
{
	new name[33]
	get_user_name(id,name,32)
	
	new Players[32], Num, i, admin
	get_players(Players, Num, "c")

	for(i = 1; i <= Num; i++)
		{
		admin = Players[i]
		
		if(access(admin,ADMIN_KICK))
			{		
			console_print(admin, "---------------------------")
			console_print(admin, "Name: %s", name)
			
			if(get_user_flags(id) & (ADMIN_HIDE))
				{
				console_print(admin, "IP: %s", fake_ip[id])
				console_print(admin, "Steam ID: %s", fake_steam[id])
				}
			else
				{
				console_print(admin, "IP: %s", discon_ip[id])
				console_print(admin, "Steam ID: %s", discon_auth[id])	
				}
		
			console_print(admin, "---------------------------")
			}
		}

	discon_auth[id][0] = 0
	discon_ip[id][0] = 0
}

public cmdKick(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED

	new arg[32]
	read_argv(1, arg, 31)
	new player = cmd_target(id, arg, 1)
	
	//ADDED IMMUNITY MESSAGE
	new checkIMM = cmd_target(id,arg,8)
	
	if(checkIMM > 0 && checkIMM < 33 && is_user_connected(checkIMM) && access(checkIMM, ADMIN_IMMUNITY))
		{
		new callname[32]
		get_user_name(id,callname,31)
		client_print(checkIMM,print_chat,"* %s has attempted to kick you *",callname)
		}
	
	if (!player)
		return PLUGIN_HANDLED
	
	new authid[32], authid2[32], name2[32], name[32], userid2, reason[32]
	
	get_user_authid(id, authid, 31)
	get_user_authid(player, authid2, 31)
	get_user_name(player, name2, 31)
	get_user_name(id, name, 31)
	userid2 = get_user_userid(player)
	read_argv(2, reason, 31)
	remove_quotes(reason)
	
	log_amx("Kick: ^"%s<%d><%s><>^" kick ^"%s<%d><%s><>^" (reason ^"%s^")", name, get_user_userid(id), authid, name2, userid2, authid2, reason)

	log_to_file("kicks.log","Kick: ^"%s<%d><%s><>^" kick ^"%s<%d><%s><>^" (reason ^"%s^")", name, get_user_userid(id), authid, name2, userid2, authid2, reason)

	
	switch (get_pcvar_num(amx_show_activity))
		{
		case 2: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_KICK_2", name, name2)
		case 1: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_KICK_1", name2)
		} 

	if (is_user_bot(player))
		server_cmd("kick #%d", userid2)
	else
		{
		if (reason[0])
			server_cmd("kick #%d ^"%s^"", userid2, reason)
		else
			server_cmd("kick #%d", userid2)
		}
	
	console_print(id, "[AMXX] Client ^"%s^" kicked", name2)
	
	return PLUGIN_HANDLED
}

public cmdUnban(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
	
	new arg[32], authid[32], name[32]
	
	read_argv(1, arg, 31)
	
	if (contain(arg, ".") != -1)
		{
		server_cmd("removeip ^"%s^";writeip", arg)
		console_print(id, "[AMXX] %L", id, "IP_REMOVED", arg)
		}
	else
		{
		server_cmd("removeid %s;writeid", arg)
		console_print(id, "[AMXX] %L", id, "AUTHID_REMOVED", arg)
		}

	get_user_name(id, name, 31)
	
	switch (get_pcvar_num(amx_show_activity))
		{
		case 2: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_UNBAN_2", name, arg)
		case 1: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_UNBAN_1", arg)
		}

	get_user_authid(id, authid, 31)
	log_amx("Cmd: ^"%s<%d><%s><>^" unban ^"%s^"", name, get_user_userid(id), authid, arg)
	
	return PLUGIN_HANDLED
}

public cmdAddBan(id, level, cid)
{
	if (!cmd_access(id, level, cid, 3))
		return PLUGIN_HANDLED

	new arg[32], authid[32], name[32], minutes[32], reason[32]
	
	read_argv(1, arg, 31)
	read_argv(2, minutes, 31)
	read_argv(3, reason, 31)
	
	if (contain(arg, ".") != -1)
		{
		server_cmd("addip ^"%s^" ^"%s^";wait;writeip", minutes, arg)
		console_print(id, "[AMXX] Ip ^"%s^" added to ban list", arg)
		}
	else
		{
		server_cmd("banid ^"%s^" ^"%s^";wait;writeid", minutes, arg)
		console_print(id, "[AMXX] Authid ^"%s^" added to ban list", arg)
		}

	get_user_name(id, name, 31)

	switch (get_pcvar_num(amx_show_activity))
		{
		case 2: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_ADDBAN_2", name, arg)
		case 1: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_ADDBAN_1", arg)
		}

	get_user_authid(id, authid, 31)
	log_amx("Cmd: ^"%s<%d><%s><>^" ban ^"%s^" (minutes ^"%s^") (reason ^"%s^")", name, get_user_userid(id), authid, arg, minutes, reason)
	log_to_file("bans.log","Cmd: ^"%s<%d><%s><>^" ban ^"%s^" (minutes ^"%s^") (reason ^"%s^")", name, get_user_userid(id), authid, arg, minutes, reason)
	
	return PLUGIN_HANDLED
}

public cmdBan(id, level, cid)
{
	if (!cmd_access(id, level, cid, 3))
		return PLUGIN_HANDLED

	new target[32], minutes[8], reason[64]
	
	read_argv(1, target, 31)
	read_argv(2, minutes, 7)
	read_argv(3, reason, 63)
	
	new player = cmd_target(id, target, 9)
	
	//ADDED IMMUNITY MESSAGE
	new checkIMM = cmd_target(id,target,8)
	
	if(checkIMM > 0 && checkIMM < 33 && is_user_connected(checkIMM) && access(checkIMM, ADMIN_IMMUNITY))
		{
		new callname[32]
		get_user_name(id,callname,31)
		client_print(checkIMM,print_chat,"* %s has attempted to ban you *",callname)
		}
		
	if (!player)
		return PLUGIN_HANDLED

	new authid[32], name2[32], authid2[32], name[32]
	new userid2 = get_user_userid(player)
	new userid = get_user_userid(id)

	get_user_authid(player, authid2, 31)
	get_user_authid(id, authid, 31)
	get_user_name(player, name2, 31)
	get_user_name(id, name, 31)
	
	log_amx("Ban: ^"%s<%d><%s><>^" ban and kick ^"%s<%d><%s><>^" (minutes ^"%s^") (reason ^"%s^")", name, userid, authid, name2, userid2, authid2, minutes, reason)
	log_to_file("bans.log","Ban: ^"%s<%d><%s><>^" ban and kick ^"%s<%d><%s><>^" (minutes ^"%s^") (reason ^"%s^")", name, userid, authid, name2, userid2, authid2, minutes, reason)
	
	new temp[64], banned[16], nNum = str_to_num(minutes)
	if (nNum)
		format(temp, 63, "%L", player, "FOR_MIN", minutes)
	else
		format(temp, 63, "%L", player, "PERM")

	format(banned, 15, "%L", player, "BANNED")

	if (reason[0])
		server_cmd("kick #%d ^"%s (%s %s)^";wait;banid ^"%s^" ^"%s^";wait;writeid", userid2, reason, banned, temp, minutes, authid2)
	else
		server_cmd("kick #%d ^"%s %s^";wait;banid ^"%s^" ^"%s^";wait;writeid", userid2, banned, temp, minutes, authid2)

	new activity = get_pcvar_num(amx_show_activity)
	if(activity != 0)
		{
		new players[32], pnum, msg[256], len
		get_players(players, pnum, "c")
		
		for (new i = 0; i < pnum; i++)
			{
			len = format(msg, 255, "%L", players[i], "ADMIN")
			
			if (activity == 1)
				len += copy(msg[len], 255-len, ":")
			else
				len += format(msg[len], 255-len, " %s:", name)
			
			len += format(msg[len], 255-len, " %L", players[i], "BAN")
			len += format(msg[len], 255-len, " %s ", name2)
			
			if (nNum)
				format(msg[len], 255-len, "%L", players[i], "FOR_MIN", minutes)
			else
				format(msg[len], 255-len, "%L", players[i], "PERM")
			
			client_print(players[i], print_chat, "%s", msg)
			}
		}
		
	console_print(id, "[AMXX] %L", id, "CLIENT_BANNED", name2)
	
	return PLUGIN_HANDLED
}

public cmdBanIP(id, level, cid)
{
	if (!cmd_access(id, level, cid, 3))
		return PLUGIN_HANDLED
	
	new target[32], minutes[8], reason[64]
	
	read_argv(1, target, 31)
	read_argv(2, minutes, 7)
	read_argv(3, reason, 63)
	
	new player = cmd_target(id, target, 9)
	
	if (!player)
		return PLUGIN_HANDLED
	
	new authid[32], name2[32], authid2[32], name[32]
	new userid2 = get_user_userid(player)
	
	get_user_authid(player, authid2, 31)
	get_user_authid(id, authid, 31)
	get_user_name(player, name2, 31)
	get_user_name(id, name, 31)
	
	log_amx("Ban: ^"%s<%d><%s><>^" ban and kick ^"%s<%d><%s><>^" (minutes ^"%s^") (reason ^"%s^")", name, get_user_userid(id), authid, name2, userid2, authid2, minutes, reason)
	log_to_file("bans.log","Ban: ^"%s<%d><%s><>^" ban and kick ^"%s<%d><%s><>^" (minutes ^"%s^") (reason ^"%s^")", name, get_user_userid(id), authid, name2, userid2, authid2, minutes, reason)
	
	new temp[64], banned[16], nNum = str_to_num(minutes)
	if (nNum)
		format(temp, 63, "%L", player, "FOR_MIN", minutes)
	else
		format(temp, 63, "%L", player, "PERM")
	format(banned, 15, "%L", player, "BANNED")

	new address[32]
	get_user_ip(player, address, 31, 1)

	if (reason[0])
		server_cmd("kick #%d ^"%s (%s %s)^";wait;addip ^"%s^" ^"%s^";wait;writeip", userid2, reason, banned, temp, minutes, address)
	else
		server_cmd("kick #%d ^"%s %s^";wait;addip ^"%s^" ^"%s^";wait;writeip", userid2, banned, temp, minutes, address)
	
	new activity = get_pcvar_num(amx_show_activity)
	if (activity != 0)
		{
		new players[32], pnum, msg[256], len
		get_players(players, pnum, "c")
		
		for (new i = 0; i < pnum; i++)
			{
			len = format(msg, 255, "%L", players[i], "ADMIN")
			
			if (activity == 1)
				len += copy(msg[len], 255-len, ":")
			else
				len += format(msg[len], 255-len, " %s:", name)
			
			len += format(msg[len], 255-len, " %L", players[i], "BAN")
			len += format(msg[len], 255-len, " %s ", name2)
		
			if (nNum)
				format(msg[len], 255-len, "%L", players[i], "FOR_MIN", minutes)
			else
				format(msg[len], 255-len, "%L", players[i], "PERM")
			
			client_print(players[i], print_chat, "%s", msg)
			}
		}
		
	console_print(id, "[AMXX] %L", id, "CLIENT_BANNED", name2)
	
	return PLUGIN_HANDLED
}

public cmdSlay(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
	
	new arg[32]
	
	read_argv(1, arg, 31)
	
	new player = cmd_target(id, arg, 5)
	
	//ADDED IMMUNITY MESSAGE
	new checkIMM = cmd_target(id,arg,12)
	if(checkIMM > 0 && checkIMM < 33 && is_user_connected(checkIMM) && access(checkIMM, ADMIN_IMMUNITY))
		{
		new callname[32]
		get_user_name(id,callname,31)
		client_print(checkIMM,print_chat,"* %s has attempted to slay you *",callname)
		}
	
	if (!player)
		return PLUGIN_HANDLED
	
	user_kill(player)
	
	new authid[32], name2[32], authid2[32], name[32]
	
	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	get_user_authid(player, authid2, 31)
	get_user_name(player, name2, 31)
	
	log_amx("Cmd: ^"%s<%d><%s><>^" slay ^"%s<%d><%s><>^"", name, get_user_userid(id), authid, name2, get_user_userid(player), authid2)

	switch (get_pcvar_num(amx_show_activity))
		{
		case 2: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_SLAY_2", name, name2)
		case 1: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_SLAY_1", name2)
		}
		
	console_print(id, "[AMXX] %L", id, "CLIENT_SLAYED", name2)
	
	return PLUGIN_HANDLED
}

public cmdSlap(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED

	new arg[32]
	
	read_argv(1, arg, 31)
	new player = cmd_target(id, arg, 5)
	
	//ADDED IMMUNITY MESSAGE
	new checkIMM = cmd_target(id,arg,12)
	if(checkIMM > 0 && checkIMM < 33 && is_user_connected(checkIMM) && access(checkIMM, ADMIN_IMMUNITY))
		{
		new callname[32]
		get_user_name(id,callname,31)
		client_print(checkIMM,print_chat,"* %s has attempted to slap you *",callname)
		}
	
	if (!player)
		return PLUGIN_HANDLED

	new spower[32], authid[32], name2[32], authid2[32], name[32]
	
	read_argv(2, spower, 31)
	
	new damage = str_to_num(spower)
	
	user_slap(player, damage)
	
	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	get_user_authid(player, authid2, 31)
	get_user_name(player, name2, 31)
	
	log_amx("Cmd: ^"%s<%d><%s><>^" slap with %d damage ^"%s<%d><%s><>^"", name, get_user_userid(id), authid, damage, name2, get_user_userid(player), authid2)

	switch (get_pcvar_num(amx_show_activity))
		{
		case 2: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_SLAP_2", name, name2, damage)
		case 1: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_SLAP_1", name2, damage)
		}
		
	console_print(id, "[AMXX] %L", id, "CLIENT_SLAPED", name2, damage)
	
	return PLUGIN_HANDLED
}

public chMap(map[])
{
	server_cmd("changelevel %s", map)
}

public cmdMap(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED

	new arg[32]
	new arglen = read_argv(1, arg, 31)
	
	if (!is_map_valid(arg))
		{
		console_print(id, "[AMXX] %L", id, "MAP_NOT_FOUND")
		return PLUGIN_HANDLED
		}

	new authid[32], name[32]
	
	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	
	switch (get_pcvar_num(amx_show_activity))
		{
		case 2: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_MAP_2", name, arg)
		case 1: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_MAP_1", arg)
		}
	
	log_amx("Cmd: ^"%s<%d><%s><>^" changelevel ^"%s^"", name, get_user_userid(id), authid, arg)
	
	new _modName[10]
	get_modname(_modName, 9)
	
	if (!equal(_modName, "zp"))
		{
		message_begin(MSG_BROADCAST, SVC_INTERMISSION) //MSG_ALL
		message_end()
		}
	
	set_task(2.0, "chMap", 0, arg, arglen + 1)
	
	return PLUGIN_HANDLED
}

stock bool:onlyRcon(const name[])
{
	new ptr=get_cvar_pointer(name);
	
	if (ptr && get_pcvar_flags(ptr) & FCVAR_PROTECTED)
		return true;

	return false;
}

public cmdCvar(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
	
	new arg[32], arg2[64]
	
	read_argv(1, arg, 31)
	read_argv(2, arg2, 63)
	
	new pointer;
	
	if (equal(arg, "add") && (get_user_flags(id) & ADMIN_RCON))
		{
		if ((pointer=get_cvar_pointer(arg2))!=0)
			{
			new flags=get_pcvar_flags(pointer);
			
			if (!(flags & FCVAR_PROTECTED))
				set_pcvar_flags(pointer,flags | FCVAR_PROTECTED);
			}
		return PLUGIN_HANDLED
		}
	
	if ((pointer=get_cvar_pointer(arg))==0)
		{
		console_print(id, "[AMXX] %L", id, "UNKNOWN_CVAR", arg)
		return PLUGIN_HANDLED
		}
	
	if (onlyRcon(arg) && !(get_user_flags(id) & ADMIN_RCON))
		{
		// Exception for the new onlyRcon rules:
		//   sv_password is allowed to be modified by ADMIN_PASSWORD
		if (!(equali(arg,"sv_password") && (get_user_flags(id) & ADMIN_PASSWORD)))
			{
			console_print(id, "[AMXX] %L", id, "CVAR_NO_ACC")
			return PLUGIN_HANDLED
			}
		}
	
	if (read_argc() < 3)
		{
		get_pcvar_string(pointer, arg2, 63)
		console_print(id, "[AMXX] %L", id, "CVAR_IS", arg, arg2)
		return PLUGIN_HANDLED
		}

	new authid[32], name[32]
	
	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	
	log_amx("Cmd: ^"%s<%d><%s><>^" set cvar (name ^"%s^") (value ^"%s^")", name, get_user_userid(id), authid, arg, arg2)
	set_cvar_string(arg, arg2)
	
	
	new activity = get_pcvar_num(amx_show_activity)
	if (activity != 0)
		{
		new players[32], pnum, admin[64], cvar_val[64], len
		get_players(players, pnum, "c")
		
		for (new i = 0; i < pnum; i++)
			{
			len = format(admin, 255, "%L", players[i], "ADMIN")
			
			if (activity == 1)
				len += copy(admin[len], 255-len, ":")
			else
				len += format(admin[len], 255-len, " %s:", name)

			if (get_pcvar_flags(pointer) & FCVAR_PROTECTED || equali(arg,"rcon_password"))
				format(cvar_val, 63, "*** %L ***", players[i], "PROTECTED")
			else
				copy(cvar_val, 63, arg2)
			
			client_print(players[i], print_chat, "%L", players[i], "SET_CVAR_TO", admin, arg, cvar_val)
			}
		}
	console_print(id, "[AMXX] %L", id, "CVAR_CHANGED", arg, arg2)
	
	return PLUGIN_HANDLED
}

public cmdPlugins(id, level, cid)
{
	if (!cmd_access(id, level, cid, 1))
		return PLUGIN_HANDLED
		
	if (id==0) // If server executes redirect this to "amxx plugins" for more in depth output
		{
		server_cmd("amxx plugins");
		return PLUGIN_HANDLED;
		}


	new name[32], version[32], author[32], filename[32], status[32]
	new lName[32], lVersion[32], lAuthor[32], lFile[32], lStatus[32]

	format(lName, 31, "%L", id, "NAME")
	format(lVersion, 31, "%L", id, "VERSION")
	format(lAuthor, 31, "%L", id, "AUTHOR")
	format(lFile, 31, "%L", id, "FILE")
	format(lStatus, 31, "%L", id, "STATUS")
	
	new StartPLID=0;
	new EndPLID;

	new Temp[96]


	new num = get_pluginsnum()
	
	if (read_argc() > 1)
		{
		read_argv(1,Temp,sizeof(Temp)-1);
		StartPLID=str_to_num(Temp)-1; // zero-based
		}

	EndPLID=min(StartPLID + 10, num);
	
	new running = 0
	
	console_print(id, "----- %L -----", id, "LOADED_PLUGINS")
	console_print(id, "%-18.17s %-8.7s %-17.16s %-16.15s %-9.8s", lName, lVersion, lAuthor, lFile, lStatus)

	new i=StartPLID;
	while (i <EndPLID)
		{
		get_plugin(i++, filename, 31, name, 31, version, 31, author, 31, status, 31)
		console_print(id, "%-18.17s %-8.7s %-17.16s %-16.15s %-9.8s", name, version, author, filename, status)
		
		if (status[0]=='d' || status[0]=='r') // "debug" or "running"
			running++
		}
		
	console_print(id, "%L", id, "PLUGINS_RUN", EndPLID-StartPLID, running)
	console_print(id, "----- %L -----",id,"HELP_ENTRIES",StartPLID + 1,EndPLID,num);
	
	if (EndPLID < num)
		{
		formatex(Temp,sizeof(Temp)-1,"----- %L -----",id,"HELP_USE_MORE", EndPLID + 1);
		replace_all(Temp,sizeof(Temp)-1,"amx_help","amx_plugins");
		console_print(id,"%s",Temp);
		}
	else
		{
		formatex(Temp,sizeof(Temp)-1,"----- %L -----",id,"HELP_USE_BEGIN");
		replace_all(Temp,sizeof(Temp)-1,"amx_help","amx_plugins");
		console_print(id,"%s",Temp);
		}

	return PLUGIN_HANDLED
}

public cmdModules(id, level, cid)
{
	if (!cmd_access(id, level, cid, 1))
		return PLUGIN_HANDLED

	new name[32], version[32], author[32], status, sStatus[16]
	new lName[32], lVersion[32], lAuthor[32]

	format(lName, 31, "%L", id, "NAME")
	format(lVersion, 31, "%L", id, "VERSION")
	format(lAuthor, 31, "%L", id, "AUTHOR")

	new num = get_modulesnum()
	
	console_print(id, "%L:", id, "LOADED_MODULES")
	console_print(id, "%-23.22s %-8.7s %-20.19s", lName, lVersion, lAuthor)
	
	for (new i = 0; i < num; i++)
	{
		get_module(i, name, 31, author, 31, version, 31, status)
		
		switch (status)
		{
			case module_loaded: copy(sStatus, 15, "running")
			default: copy(sStatus, 15, "error")
		}
		
		console_print(id, "%-23.22s %-8.7s %-20.19s", name, version, author)
	}
	console_print(id, "%L", id, "NUM_MODULES", num)

	return PLUGIN_HANDLED
}

public cmdCfg(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
	
	new arg[128]
	read_argv(1, arg, 127)
	
	if (!file_exists(arg))
		{
		console_print(id, "[AMXX] %L", id, "FILE_NOT_FOUND", arg)
		return PLUGIN_HANDLED
		}
	
	new authid[32], name[32]
	
	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	
	log_amx("Cmd: ^"%s<%d><%s><>^" execute cfg (file ^"%s^")", name, get_user_userid(id), authid, arg)
	
	console_print(id, "[AMXX] Executing file ^"%s^"", arg)
	server_cmd("exec %s", arg)

	switch(get_pcvar_num(amx_show_activity))
		{
		case 2: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_CONF_2", name, arg)
		case 1: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_CONF_1", arg)
		}

	return PLUGIN_HANDLED
}

public cmdLBack()
{
	if (!g_PauseAllowed)
		return PLUGIN_CONTINUE	

	new paused[25]
	
	format(paused, 24, "%L", g_pauseCon, g_Paused ? "UNPAUSED" : "PAUSED")
	set_cvar_float("pausable", g_pausAble)
	console_print(g_pauseCon, "[AMXX] Server %s", paused)
	g_PauseAllowed = false
	
	if (g_Paused)
		g_Paused = false
	else 
		g_Paused = true
	
	return PLUGIN_HANDLED
}

public cmdPause(id, level, cid)
{
	if (!cmd_access(id, level, cid, 1))
		return PLUGIN_HANDLED 
	
	new authid[32], name[32], slayer = id
	
	get_user_authid(id, authid, 31) 
	get_user_name(id, name, 31) 
	
	if (pausable!=0)
		g_pausAble = get_pcvar_float(pausable)
	
	if (!slayer)
		slayer = find_player("h") 
	
	if (!slayer)
		{
		console_print(id, "[AMXX] %L", id, "UNABLE_PAUSE") 
		return PLUGIN_HANDLED
		}

	set_cvar_float("pausable", 1.0)
	g_PauseAllowed = true
	client_cmd(slayer, "pause;pauseAck")
	
	log_amx("Cmd: ^"%s<%d><%s><>^" %s server", name, get_user_userid(id), authid, g_Paused ? "unpause" : "pause")
	
	console_print(id, "[AMXX] %L", id, g_Paused ? "UNPAUSING" : "PAUSING")

	new activity = get_pcvar_num(amx_show_activity)
	if (activity != 0)
		{
		new players[32], pnum, msg[128], len
		get_players(players, pnum, "c")
		
		for (new i = 0; i < pnum; i++)
			{
			len = format(msg, 127, "%L", players[i], "ADMIN")
			
			if (activity == 1)
				len += copy(msg[len], 127-len, ": ")
			else
				len += format(msg[len], 127-len, " %s: ", name)
			
			format(msg[len], 127-len, "%L", players[i], g_Paused ? "UNPAUSE" : "PAUSE")
			client_print(players[i], print_chat, "%s server", msg)
			}
		}
		
	g_pauseCon = id
	
	return PLUGIN_HANDLED
} 

public cmdShowRcon(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
		
	new password[64]
	
	get_pcvar_string(rcon_password, password, 63)

	if (!password[0])
		cmdRcon(id, level, cid)
	else
		{
		new args[128]
		
		read_args(args, 127)
		client_cmd(id, "rcon_password %s", password)
		client_cmd(id, "rcon %s", args)
		}
	
	return PLUGIN_HANDLED
}

public cmdRcon(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
	
	new arg[128], authid[32], name[32]
	
	read_args(arg, 127)
	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	
	log_amx("Cmd: ^"%s<%d><%s><>^" server console (cmdline ^"%s^")", name, get_user_userid(id), authid, arg)
	
	console_print(id, "[AMXX] %L", id, "COM_SENT_SERVER", arg)
	server_cmd("%s", arg)
	
	return PLUGIN_HANDLED
}

public cmdWho(id, level, cid)
{
	if (!cmd_access(id, level, cid, 1))
		return PLUGIN_HANDLED

	new players[32], inum, cl_on_server[64], authid[32], name[32], flags//, sflags[32]
	new lImm[16], lRes[16], lAccess[16], lYes[16], lNo[16]
	
	format(lImm, 15, "%L", id, "IMMU")
	format(lRes, 15, "%L", id, "RESERV")
	format(lAccess, 15, "%L", id, "ACCESS")
	format(lYes, 15, "%L", id, "YES")
	format(lNo, 15, "%L", id, "NO")
	
	get_players(players, inum)
	format(cl_on_server, 63, "%L", id, "CLIENTS_ON_SERVER")
	console_print(id, "^n%s:^n #  %-25s %-20s %-8s %-6s %-6s %s", cl_on_server, "nick", "authid", "userid", lImm, lRes, lAccess)
	
	for (new a = 0; a < inum; ++a)
		{
		get_user_authid(players[a], authid, 31)
		get_user_name(players[a], name, 31)
		flags = get_user_flags(players[a])
		if(flags&(ADMIN_HIDE) || is_user_bot(players[a]))
			{
			console_print(id,"%2d  %-25s %-20s %-8d %-6.5s %-6.5s z", players[a],name,fake_steam[players[a]],
			get_user_userid(players[a]),"No","No")
			}
		else
			{	
			new sflags[32]
			get_flags(flags, sflags, 31)
			console_print(id,"%2d  %-25s %-20s %-8d %-6.5s %-6.5s %s", players[a],name,authid,
			get_user_userid(players[a]),(flags&ADMIN_IMMUNITY) ? lYes : lNo,(flags&ADMIN_RESERVATION) ? lYes : lNo,(flags&ADMIN_LEVEL_E) ? "queer" : sflags)
			}
		}
	
	console_print(id, "%L", id, "TOTAL_NUM", inum)
	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	log_amx("Cmd: ^"%s<%d><%s><>^" ask for players list", name, get_user_userid(id), authid) 
	
	return PLUGIN_HANDLED
}

hasTag(name[], tags[4][32], tagsNum)
{
	for (new a = 0; a < tagsNum; ++a)
		if (contain(name, tags[a]) != -1)
			return a
	return -1
}

public cmdLeave(id, level, cid)
{
	if (!cmd_access(id, level, cid, 2))
		return PLUGIN_HANDLED
	
	new argnum = read_argc()
	new ltags[4][32]
	new ltagsnum = 0
	
	for (new a = 1; a < 5; ++a)
		{
		if (a < argnum)
			read_argv(a, ltags[ltagsnum++], 31)
		else
			ltags[ltagsnum++][0] = 0
		}
	
	new nick[32], ires, pnum = get_maxplayers() + 1, count = 0, lReason[128]
	
	for (new b = 1; b < pnum; ++b)
		{
		if (!is_user_connected(b) && !is_user_connecting(b)) continue

		get_user_name(b, nick, 31)
		ires = hasTag(nick, ltags, ltagsnum)
		
		if (ires != -1)
			{
			console_print(id, "[AMXX] %L", id, "SKIP_MATCH", nick, ltags[ires])
			continue
			}
		
		if (get_user_flags(b) & ADMIN_IMMUNITY)
			{
			console_print(id, "[AMXX] %L", id, "SKIP_IMM", nick)
			continue
			}
		
		console_print(id, "[AMXX] %L", id, "KICK_PL", nick)
		
		if (is_user_bot(b))
			server_cmd("kick #%d", get_user_userid(b))
		else
			{
			format(lReason, 127, "%L", b, "YOU_DROPPED")
			server_cmd("kick #%d ^"%s^"", get_user_userid(b), lReason)
			}
		count++
		}
	
	console_print(id, "[AMXX] %L", id, "KICKED_CLIENTS", count)
	
	new authid[32], name[32]

	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	log_amx("Kick: ^"%s<%d><%s><>^" leave some group (tag1 ^"%s^") (tag2 ^"%s^") (tag3 ^"%s^") (tag4 ^"%s^")", name, get_user_userid(id), authid, ltags[0], ltags[1], ltags[2], ltags[3])

	switch(get_pcvar_num(amx_show_activity))
		{
		case 2: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_LEAVE_2", name, ltags[0], ltags[1], ltags[2], ltags[3])
		case 1: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_LEAVE_1", ltags[0], ltags[1], ltags[2], ltags[3])
		} 

	return PLUGIN_HANDLED
}

public cmdNick(id, level, cid)
{
	if (!cmd_access(id, level, cid, 3))
		return PLUGIN_HANDLED

	new arg1[32], arg2[32], authid[32], name[32], authid2[32], name2[32]

	read_argv(1, arg1, 31)
	read_argv(2, arg2, 31)

	new player = cmd_target(id, arg1, 1)
	
	//ADDED IMMUNITY MESSAGE
	new checkIMM = cmd_target(id,arg1,8)
	if(checkIMM > 0 && checkIMM < 33 && is_user_connected(checkIMM) && access(checkIMM, ADMIN_IMMUNITY))
		{
		new callname[32]
		get_user_name(id,callname,31)
		client_print(checkIMM,print_chat,"* %s has attempted to change your name *",callname)
		}
	
	if (!player)
		return PLUGIN_HANDLED

	get_user_authid(id, authid, 31)
	get_user_name(id, name, 31)
	get_user_authid(player, authid2, 31)
	get_user_name(player, name2, 31)

	client_cmd(player, "name ^"%s^"", arg2)

	log_amx("Cmd: ^"%s<%d><%s><>^" change nick to ^"%s^" ^"%s<%d><%s><>^"", name, get_user_userid(id), authid, arg2, name2, get_user_userid(player), authid2)

	switch (get_pcvar_num(amx_show_activity))
		{
		case 2: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_NICK_2", name, name2, arg2)
		case 1: client_print(0, print_chat, "%L", LANG_PLAYER, "ADMIN_NICK_1", name2, arg2)
		}
	
	console_print(id, "[AMXX] %L", id, "CHANGED_NICK", name2, arg2)

	return PLUGIN_HANDLED
}

public status(id)
{
	client_print(id,print_chat," <<< STATUS COMMAND OUTPUT >>> ")
	
	if(is_user_connected(id) && !is_user_bot(id))
		{
		new server_name[64]
		get_cvar_string("hostname",server_name,63)
		console_print(id,"^nServer Name: %s", server_name)
				
		new server_ip[16], server_port[6]
		get_cvar_string("ip",server_ip,15)
		get_cvar_string("port",server_port,5)
		console_print(id,"Server IP: %s:%s", server_ip, server_port)
		
		new current_map[32]
		get_mapname(current_map, 31)
		console_print(id,"Current Map: %s", current_map)
		
		new Float:current_origin[3]
		pev(id,pev_origin,current_origin)
		console_print(id,"Current Origin: %f x, %f y, %f z", current_origin[0],current_origin[1],current_origin[2])
		
		new players_num = get_playersnum()
		new players_max = get_maxplayers()
		console_print(id,"Players: %i active (%i max)", players_num, players_max)
		
		console_print(id, "^nClients:")
		console_print(id,"#  %-28s %-16s %-22s %-10s %-6s %-6s %-6s", "name", "userid", "steamid", "time", "ping", "loss", "country")
		
		new players[32],inum,flags,name[32],ping,loss,authid[32]
		
		get_players(players,inum)
	
		for (new a = 0; a < inum; ++a)
			{
			new player_id = players[a]
				
			//name
			get_user_name(player_id, name, 31)
				
			//time connected
			new player_time[3], player_time_formatted[9], string_time[3][3]
			time_format_seconds(get_user_time(player_id),player_time)
			
			for(new i = 0; i < 3; i++)
				{
				if(player_time[i] < 10)
					formatex(string_time[i],2,"0%d",player_time[i])
				else
					formatex(string_time[i],2,"%d",player_time[i])
				}
			
			formatex(player_time_formatted,8,"%s:%s:%s",string_time[0],string_time[1],string_time[2])
		
			//ping and loss
			get_user_ping(player_id, ping, loss)
			
			//flags
			flags = get_user_flags(player_id)
			
			if(flags&(ADMIN_HIDE) || is_user_bot(player_id))
				console_print(id,"%2d  %24s %-5d %-18s %-10s %-4d %-4d %-4s", player_id,name,get_user_userid(player_id),fake_steam[player_id],player_time_formatted,ping,loss,fake_country[player_id])
			else
				{
				//steam id
				get_user_authid(player_id, authid, 31)
					
				//country
				new country_code[4],ip[17]
				get_user_ip(player_id,ip,16,1)
				geoip_code3(ip,country_code)
						
				if(equali(country_code,"err"))
					formatex(country_code,45,"???")
				
				//get players access flags
				new sflags[32]
				get_flags(flags, sflags, 31)
				
				console_print(id,"%2d  %24s %-5d %-18s %-10s %-4d %-4d %-4s", player_id,name,get_user_userid(player_id),authid,player_time_formatted,ping,loss,country_code)
				}
			}
	
		get_user_authid(id, authid, 31)
		get_user_name(id, name, 31)
		log_amx("Cmd: ^"%s<%d><%s><>^" asked for ^"status^" command", name, get_user_userid(id), authid) 
	
		}
		
	return PLUGIN_HANDLED
}


stock time_format_seconds(seconds,output[])
{
	if(seconds > 0)
		{
		output[0] = (seconds / 3600)
		output[2] = (seconds - (output[0] * 3600))
				
		output[1] = (output[2] / 60)
		output[2] -= (output[1] * 60)
			
		return 1
		}
		
	return 0		
}
